#include <stdio.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

// 预处理指令的要求：
// 1. 只能写一行
// 2. 使用{}来形成复合语句，使用({})来形成表达式语句

// 无值宏
#define A 

// 无参宏
#define PI 3.14159264
#define SCREEN_SIZE 800*480*4 

// typedef/typeof
// int   / float    OK!
// int * / float *  WRONG!

// 带参宏
// &_a == &_b 是为了让编译器判断a和b是否属于同种类型，不同类型就报警告
// (void) 是为了避免编译器对语句&_a == &_b发出"no effect"的警告
#define MAX(a, b)  ({ \
                     typeof(a) _a=(a); \
                     typeof(b) _b=(b); \
                     (void)(&_a == &_b); \
                     (_a>_b? _a : _b); \
                   })

int max(int a, int b)
{
    return a>b ? a : b;
}

int main(int argc, char const *argv[])
{
    int x = 100, y = 200;
    printf("最大值:%d\n", MAX(x, ++y)); // 201
    printf("x: %d\n", x); // 100
    printf("y: %d\n", y); // 201

    float f1 = 1.1;
    float f2 = 100.2;
    printf("最大值:%f\n",   MAX(f1, f2)); // 1.2
    printf("最大值:%.2f\n", MAX(x, f2)); // 当不同类型放一起运算时，要报警告

    // printf("最大值:%d\n", MAX(++x, y)); // 200
    // printf("x: %d\n", x); // 101
    // printf("y: %d\n", y); // 200

    // printf("%f\n", PI);
    // printf("%d\n", MAX(1,2+3)); // 程序执行效率高，存储空间浪费
    // printf("%d\n", max(1,2+3)); // 程序执行效率低，存储空间不浪费

    // // 映射一块SCREEN_SIZE的内存
    // mmap(NULL, SCREEN_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, 0, 0);

    return 0;
}
